passkeys.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { IS_PLATFORM, useFeatureFlags, useFlag } from 'common'
  2. import { PageContainer } from 'ui-patterns/PageContainer'
  3. import {
  4. PageHeader,
  5. PageHeaderDescription,
  6. PageHeaderMeta,
  7. PageHeaderSummary,
  8. PageHeaderTitle,
  9. } from 'ui-patterns/PageHeader'
  10. import { PageSection, PageSectionContent } from 'ui-patterns/PageSection'
  11. import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
  12. import { PasskeysSettingsForm } from '@/components/interfaces/Auth/Passkeys/PasskeysSettingsForm'
  13. import AuthLayout from '@/components/layouts/AuthLayout/AuthLayout'
  14. import DefaultLayout from '@/components/layouts/DefaultLayout'
  15. import type { NextPageWithLayout } from '@/types'
  16. const PasskeysPage: NextPageWithLayout = () => {
  17. const { hasLoaded: flagsLoaded } = useFeatureFlags()
  18. const isPasskeyAuthEnabled = useFlag('enablePasskeyAuth')
  19. const isResolvingPasskeyFlag = IS_PLATFORM && !flagsLoaded
  20. if (isResolvingPasskeyFlag) {
  21. return (
  22. <>
  23. <PageHeader size="default">
  24. <PageHeaderMeta>
  25. <HeaderSummary />
  26. </PageHeaderMeta>
  27. </PageHeader>
  28. <PageContainer size="default">
  29. <PageSection>
  30. <PageSectionContent>
  31. <GenericSkeletonLoader />
  32. </PageSectionContent>
  33. </PageSection>
  34. </PageContainer>
  35. </>
  36. )
  37. }
  38. if (!isPasskeyAuthEnabled) {
  39. return (
  40. <PageContainer size="default">
  41. <PageSection>
  42. <PageSectionContent>
  43. <p className="text-sm text-foreground-light">
  44. Passkey authentication is not available for this project.
  45. </p>
  46. </PageSectionContent>
  47. </PageSection>
  48. </PageContainer>
  49. )
  50. }
  51. return (
  52. <>
  53. <PageHeader size="default">
  54. <PageHeaderMeta>
  55. <HeaderSummary />
  56. </PageHeaderMeta>
  57. </PageHeader>
  58. <PageContainer size="default">
  59. <PageSection>
  60. <PageSectionContent>
  61. <PasskeysSettingsForm />
  62. </PageSectionContent>
  63. </PageSection>
  64. </PageContainer>
  65. </>
  66. )
  67. }
  68. const HeaderSummary = () => {
  69. return (
  70. <PageHeaderSummary>
  71. <PageHeaderTitle>Passkeys</PageHeaderTitle>
  72. <PageHeaderDescription>
  73. Configure WebAuthn passkeys so users can sign in with biometrics, security keys, or platform
  74. authenticators
  75. </PageHeaderDescription>
  76. </PageHeaderSummary>
  77. )
  78. }
  79. PasskeysPage.getLayout = (page) => (
  80. <DefaultLayout>
  81. <AuthLayout title="Passkeys">{page}</AuthLayout>
  82. </DefaultLayout>
  83. )
  84. export default PasskeysPage